# -*- coding: UTF-8 -*-
# __author__ = '10459'

from sqlalchemy import Column, Integer, String, Boolean, Float, ForeignKey, desc, func
from sqlalchemy.orm import relationship
from app.models.base import Base, db
from app.spider.yushu_book import YuShuBook
from flask import current_app


# from collections import namedtuple
# namedtuple快速创建对象

# EachGiftWishCount=namedtuple('EachGiftWishCount',['count','isbn']) #快速创建对象，使用的时候对象.属性方式调用，属性就是这里定义的count或isbn，前面就是对象名
class Gift(Base):
    id = Column(Integer, primary_key=True)
    launched = Column(Boolean, default=False)  # False表示没有送出去，True表示送出去了
    user = relationship("User")
    uid = Column(Integer, ForeignKey("user.id"))  # 用户唯一标识，记录不同用户
    # book = relationship("Book")   本项目是通过url访问来获取书的，所以这两个要注释
    # bid = Column(Integer,ForeignKey("book.id")) #图书的唯一标识，记录不同图书
    isbn = Column(String(15), nullable=False)
    # 获取用户礼物
    def is_yourself_gift(self, uid):
        return True if self.uid == uid else False

    @classmethod
    def get_user_gifts(cls, uid):
        gifts = Gift.query.filter_by(uid=uid, launched=False).order_by(
            desc(Gift.create_time)).all()
        return gifts

    @classmethod
    def get_wish_counts(cls, isbn_list):
        from app.models.wish import Wish  # 防止循环导入，所以在这里导入
        # 根据传入的一组isbn，需在wish表中计算每个礼物的wish数量
        # db.session可以查询，删除，创建表
        # filter需要接受条件表达式，与filter_by（关键字参数）不同
        # 每一本书对应的数量，书是组，数量也是组，所以要group_by
        # isbn  wish的数量，而不是查出wish的所有东西,所以查询的条件是func.count(Wish.id),query里就是sql里面查询的结果显示哪些字段
        # in查询，需要查出每个isbn对应wish的数量Wish.isbn.in_(列表),status==1表示没有被删除，filter_by没写，是因为做了前面做了改写把status写上去了
        # 函数中不要返回元组而应返回字典
        count_list = db.session.query(func.count(Wish.id), Wish.isbn).filter(
            Wish.launched == False,
            Wish.isbn.in_(isbn_list),
            Wish.status == 1).group_by(Wish.isbn).all()
        # 把数据返回成字典
        count_list = [{"count": w[0], "isbn": w[1]} for w in count_list]
        return count_list

    # 获取单本书
    @property
    def book(self):
        yushu_book = YuShuBook()
        yushu_book.search_by_isbn(self.isbn)
        print ("yushubook类型：",type(yushu_book.first))
        return yushu_book.first

    @classmethod  # 实例方法不合适，对象代表礼物，具体，类代表礼物这个事物，是抽象的，而不是具体“一个”
    def recent(cls):
        # 链式调用
        # 主体Query
        # 子函数，返回的都是主体函数对象query
        # first（），all（）才会执行语句触发语句
        # group_by(cls.isbn)这个语句需要使用sql命令把global.sql_mode中的ONLY_FULL_GROUP_BY去掉才可以使用
        recent_gift = Gift.query.filter_by(launched=False).group_by(cls.isbn).order_by(
            desc(Gift.create_time)).limit(
            current_app.config['RECENT_BOOK_COUNT']).distinct().all()
        return recent_gift
        # @classmethod
        # def get_wish_counts(cls,isbn_list):
        #     count_list=db.session.query(func.count(Wish.id),Wish.isbn).filter(
        #         Wish.launched == False,
        #         Wish.isbn.in_(isbn_list),
        #         Wish.status==1).group_by(Wish.isbn).all()
        #     count_list=[EachGiftWishCount(w[0],w[1]) for w in count_list]  #使用这个来做转换成对象
        #     return count_list
